package com.pattern.proxy.v6;


import java.util.Random;

/**
 * 继承不好，使用聚合方式
 * 该方式添加时间代理、日志代理都可以，但是实现各种代理的组合呢？
 * 无法同时实现代理时间和日志 --- v7 被代理对象改成接口
 *
 */
public class Tank implements Movable {
    @Override
    public void move() {
        System.out.println("tank moving ");
        try {
            Thread.sleep(new Random().nextInt(10000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
//        new TankTimeProxy(new TankLogProxy()).move();
    }
}

/**
 * Tank时间代理类， 内部添加一个成员变量
 */
class TankTimeProxy implements Movable {

    /**
     * 被代理人
     * 问题： 这块被代理的对象还是不够灵活，只能代理Tank ---- v6
     * 被代理的对象可以是接口 --- v7
     */
    Tank tank;

    public TankTimeProxy(Tank tank) {
        this.tank = tank;
    }

    @Override
    public void move() {
        Long start = System.currentTimeMillis();
        tank.move();
        Long end = System.currentTimeMillis();
        System.out.println("运行时间： " + (end -start));
    }
}

/**
 * Tank日志代理类， 内部添加一个成员变量
 */
class TankLogProxy implements Movable {

    /**
     * 被代理人
     * 问题： 这块被代理的对象还是不够灵活，只能代理Tank ---- v6
     * 被代理的对象可以是接口
     */
    Tank tank;

    public TankLogProxy(Tank tank) {
        this.tank = tank;
    }

    @Override
    public void move() {
        System.out.println("tank 开始执行。。。。。。。。");
        tank.move();
        System.out.println("tank 执行结束。。。。。。。。。。。");
    }

    /*
    此时如果实现时间代理和日志代理，是无法做到的

    TankTimeProxy tankTimeProxy;

    public TankLogProxy(TankTimeProxy tankTimeProxy) {
        this.tankTimeProxy = tankTimeProxy;
    }

    @Override
    public void move() {
        System.out.println("TankTimeProxy 开始执行。。。。。。。。");
        tankTimeProxy.move();
        System.out.println("TankTimeProxy 执行结束。。。。。。。。。。。");
    }

    */
}

interface Movable {
    void move();
}
